package com.flyan.danmuhunter.bilibili.data;

import com.flyan.danmuhunter.common.model.Pair;
import lombok.Getter;
import lombok.ToString;

import java.util.HashMap;
import java.util.Map;

/**
 * 操作代码
 *
 * @author flyan
 * @version 1.0
 * @date 2022/6/7
 */
@Getter
@ToString
public class Op {

    private final int opVal;
    private final OpType opType;

    public Op(int opVal) {
        this.opVal = opVal;
        this.opType = OpType.valueOf(opVal);
    }

    public static enum OpType {

        /**
         * 客户端发送的心跳包
         */
        CLIENT_HEARTBEAT(2, "客户端发送的心跳包"),

        /**
         * 客户端发送认证并加入房间
         */
        CLIENT_AUTH_JOIN_ROOM(7, "客户端发送认证并加入房间"),

        /**
         * 人气值，数据不是JSON，是4字节整数
         */
        POPULAR_VAL(3, "人气值，数据不是JSON，是4字节整数"),

        /**
         * 命令，数据中[‘cmd’]表示具体命令
         */
        CMD(5, "命令，数据中[‘cmd’]表示具体命令"),

        /**
         * 服务器发送的心跳包
         */
        SERVER_HEARTBEAT(8, "服务器发送的心跳包");

        @Getter
        private final int code;

        @Getter
        private final String desc;

        OpType(int code, String desc) {
            this.code = code;
            this.desc = desc;
        }

        private static final Map<Integer, Pair<String, String>> STATUS_MAP = new HashMap<>();
        static {
            for (OpType x : OpType.values()) {
                STATUS_MAP.put(x.getCode(), new Pair<>(x.name(), x.getDesc()));
            }
        }

        public static OpType valueOf(int code) {
            Pair<String, String> p = STATUS_MAP.get(code);
            return p != null ? OpType.valueOf(p.getK()) : null;
        }

        @Override
        public String toString() {
            return desc;
        }
    }

}
